export function convertToSmallestUnit(valueStr: string) {
    // 定义单位映射表
    const unitMap: {[key: string]: number} = {
        'K': 1000,
        'M': 1000 * 1000,
        'G': 1000 * 1000 * 1000,
        'T': 1000 * 1000 * 1000 * 1000,
        'KB': 1024,
        'MB': 1024 * 1024,
        'GB': 1024 * 1024 * 1024,
        'TB': 1024 * 1024 * 1024 * 1024
    };
    // 提取数字部分和单位部分
    const match = valueStr.match(/^([\d.]+)([A-Za-z]+)$/);
    if (!match) {
      throw new Error('Invalid input format');
    }
    const numberPart = parseFloat(match[1]);
    const unitPart = match[2].toUpperCase();
    // 查找单位对应的乘数
    const multiplier = unitMap[unitPart];
    if (!multiplier) {
        throw new Error('Unknown unit: ' + unitPart);
    }
    // 计算并返回结果
    return numberPart * multiplier;
}


export async function createFormDataFromBlobUrl(
  fileObj: {
    name?: string;
    size?: number;
    type?: string;
    url: string;
  },
  fieldName: string = 'file'
): Promise<[FormData, File]> {
  try {
    // 1. 验证输入
    if (!fileObj?.url || !fileObj.url.startsWith('blob:')) {
      throw new Error('无效的Blob URL');
    }

    // 2. 获取Blob数据
    const response = await fetch(fileObj.url);
    if (!response.ok) {
      throw new Error(`获取Blob数据失败: ${response.status} ${response.statusText}`);
    }
    const blob = await response.blob();

    // 3. 验证Blob数据
    if (blob.size !== fileObj.size) {
      console.warn('文件大小不匹配，Blob大小:', blob.size, '预期大小:', fileObj.size);
    }

    // 4. 创建FormData
    const formData = new FormData();
    const file = new File([blob], fileObj.name ?? '', { type: fileObj.type });
    formData.append(fieldName, file, fileObj.name);

    // 5. 添加额外信息（可选）
    formData.append('originalMetadata', JSON.stringify({
      name: fileObj.name,
      size: fileObj.size,
      type: fileObj.type
    }));

    return [formData, file];
  } catch (error) {
    console.error('创建FormData失败:', error);
    throw error; // 可以选择重新抛出或返回一个空的FormData
  }
}


/**
 * 从FormData还原为原始文件对象
 * @param formData 包含文件的FormData对象
 * @param fieldName 表单字段名称，默认为'file'
 * @returns 返回Promise<Array<{name: string, size: number, type: string, url: string}>>
 */
export function restoreFileObjectsFromFormData(
  formData: FormData,
  fieldName: string = 'file'
): {name?: string, size?: number, type?: string, url?: string} {
  let results: {name?: string, size?: number, type?: string, url?: string} = {}
  
  try {
    // 处理单个文件或多个文件（支持 fieldName 和 fieldName[] 格式）
    const fileFields = Array.from(formData.entries())
      .filter(([key, value]) => 
        key === fieldName || 
        key.startsWith(`${fieldName}[`) || 
        key.startsWith(`${fieldName}.`)
      );

    for (const [key, value] of fileFields) {
      if (value instanceof File) {
        const file = value;
        // 创建Blob URL
        const blobUrl = URL.createObjectURL(file);
        
        results = {
          name: file.name,
          size: file.size,
          type: file.type,
          url: blobUrl
        }
      }
    }

    // 如果没有找到文件，尝试从原始元数据恢复
      const metadata = formData.get('originalMetadata');
      if (metadata && typeof metadata === 'string') {
        try {
          const parsed = JSON.parse(metadata);
          if (parsed.name && parsed.size && parsed.type) {
            results = {
              ...parsed,
              url: '' // 无法恢复原始Blob URL，留空
            }
          }
        } catch (e) {
          console.warn('解析原始元数据失败', e);
        }
      }

    return results;
  } catch (error) {
    console.error('从FormData恢复文件对象失败:', error);
    throw error;
  }
}